package br.com.lojapi.dao;

import br.com.lojapi.bean.Cliente;
import br.com.lojapi.bean.Endereco;
import br.com.lojapi.bean.Perfil;
import br.com.lojapi.bean.Usuario;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Aluno
 */
public class ClienteDAOImp implements ClienteDAO {

    @Override
    public Object salvar(Object obj) throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        Cliente cliente = (Cliente) obj;
        PessoaDAO pessoaDAO = new PessoaDAOImp();
        pessoaDAO.salvar(obj);
        UsuarioDAO usuarioDAO = new UsuarioDAOImp();
        usuarioDAO.salvar(obj);
        try {
            String SQL = "INSERT INTO cliente(id, rg) "
                    + "VALUES(?, ?)";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            ps.setInt(1, cliente.getId());
            ps.setString(2, cliente.getRg());
            ps.executeUpdate();
        } catch (SQLException se) {
            throw new Exception("Erro ao tentar inserir dados do cliente" + se.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps);
        }
        return cliente;
    }

    @Override
    public void alterar(Object obj) throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        PessoaDAO pessoaDAO = new PessoaDAOImp();
        pessoaDAO.alterar(obj);
        Cliente cliente = (Cliente) obj;
        try {
            String SQL = "UPDATE cliente SET rg=? WHERE id=?";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            ps.setString(1, cliente.getRg());
            ps.setInt(2, cliente.getId());
            ps.executeUpdate();
        } catch (SQLException se) {
            throw new Exception("Erro ao tentar atualizar dados" + se.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps);
        }
    }

    @Override
    public void excluir(int id) throws Exception {
        PessoaDAO pessoaDao = new PessoaDAOImp();
        pessoaDao.excluir(id);
    }

    @Override
    public Object procurar(Integer id) throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        Cliente cliente = null;
        try {
            String SQL = "SELECT * FROM pessoa p join cliente c on p.id = c.id "
                    + "join endereco e ON e.idPessoa = p.id "
                    + "join usuario usu ON usu.id = c.id "
                    + "join perfil pe ON pe.id = usu.idPerfil where p.id = ?";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            ps.setInt(1, id);
            rs = ps.executeQuery();
            if (rs.next()) {
                cliente = new Cliente();
                Endereco endereco = new Endereco();
                Perfil perfil = new Perfil();
                cliente.setPerfil(perfil);
                cliente.setEndereco(endereco);
                cliente.setEndereco(new Endereco());
                cliente.setPerfil(new Perfil());
                cliente.setId(rs.getInt("p.id"));
                cliente.setNome(rs.getString("p.nome"));
                cliente.setEmail(rs.getString("email"));
                cliente.setTelefone(rs.getString("telefone"));
                cliente.getEndereco().setId(rs.getInt("e.id"));
                cliente.setLogin(rs.getString("usu.login"));
                cliente.setSenha(rs.getString("usu.senha"));
                cliente.setCpf(rs.getString("usu.cpf"));
                cliente.setRg(rs.getString("rg"));
                cliente.getPerfil().setId(rs.getInt("usu.idPerfil"));
                cliente.getPerfil().setTipo(rs.getString("pe.tipo"));
                cliente.getEndereco().setRua(rs.getString("rua"));
                cliente.getEndereco().setNumero(rs.getString("numero"));
                cliente.getEndereco().setBairro(rs.getString("bairro"));
                cliente.getEndereco().setCidade(rs.getString("cidade"));
                cliente.getEndereco().setEstado(rs.getString("estado"));
                cliente.getEndereco().setPais(rs.getString("pais"));
                perfil.setId(rs.getInt("pe.id"));
                perfil.setTipo(rs.getString("pe.tipo"));
            }
        } catch (SQLException se) {
            throw new Exception("Erro ao tentar procurar cliente" + se.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps, rs);
        }
        return cliente;
    }

    @Override
    public List listar() throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        Cliente cliente = new Cliente();
        Usuario usuario = new Usuario();
        Perfil perfil = new Perfil();
        Endereco endereco = new Endereco();
        List clientes = new ArrayList();
        try {
            String SQL = "SELECT p.*, c.*, e.*,usu.* "
                    + "FROM pessoa p join cliente c on p.id = c.idPessoa "
                    + "join endereco e on e.idPessoa = p.id "
                    + "join usuario usu on usu.id = c.idUsuario ";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            rs = ps.executeQuery();
            while (rs.next()) {
                cliente.setId(rs.getInt("p.id"));
                cliente.setNome(rs.getString("p.nome"));
                cliente.setRg(rs.getString("rg"));
                cliente.setCpf(rs.getString("cpf"));
                cliente.setEmail(rs.getString("email"));
                cliente.setTelefone(rs.getString("telefone"));
                endereco.setId(rs.getInt("e.id"));
                endereco.setRua(rs.getString("rua"));
                endereco.setNumero(rs.getString("numero"));
                endereco.setBairro(rs.getString("bairro"));
                endereco.setCidade(rs.getString("cidade"));
                endereco.setEstado(rs.getString("estado"));
                endereco.setPais(rs.getString("pais"));
                cliente.setEndereco(endereco);
                usuario.setId(rs.getInt("usu.id"));
                usuario.setLogin(rs.getString("usu.login"));
                usuario.setSenha(rs.getString("usu.senha"));
                perfil.setId(Integer.parseInt("id"));
                cliente.setPerfil(perfil);
                clientes.add(cliente);
            }
        } catch (SQLException se) {
            throw new Exception("Erro ao tentar atualizar dados"
                    + se.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps, rs);
        }
        return clientes;
    }

    @Override
    public List<Cliente> pesquisaPorNome(String nome) throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        List clientes = new ArrayList();
        try {
            String SQL = "SELECT * FROM pessoa p "
                    + "join cliente c on p.id = c.id join endereco e on e.idPessoa = p.id "
                    + "join usuario usu on usu.id = c.id WHERE p.nome LIKE ?";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            ps.setString(1, "%" + nome + "%");
            rs = ps.executeQuery();
            while (rs.next()) {
                Cliente cliente = new Cliente();
                cliente.setEndereco(new Endereco());
                cliente.setPerfil(new Perfil());
                cliente.setId(rs.getInt("p.id"));
                cliente.setNome(rs.getString("p.nome"));
                cliente.setEmail(rs.getString("email"));
                cliente.setTelefone(rs.getString("telefone"));
                cliente.getEndereco().setId(rs.getInt("e.id"));
                cliente.setLogin(rs.getString("usu.login"));
                cliente.setSenha(rs.getString("usu.senha"));
                cliente.setCpf(rs.getString("usu.cpf"));
                cliente.setRg(rs.getString("rg"));
                cliente.getPerfil().setId(rs.getInt("usu.idPerfil"));
                cliente.getEndereco().setRua(rs.getString("rua"));
                cliente.getEndereco().setNumero(rs.getString("numero"));
                cliente.getEndereco().setBairro(rs.getString("bairro"));
                cliente.getEndereco().setCidade(rs.getString("cidade"));
                cliente.getEndereco().setEstado(rs.getString("estado"));
                cliente.getEndereco().setPais(rs.getString("pais"));
                clientes.add(cliente);
            }
        } catch (SQLException se) {
            System.out.println(" erro ---- " + se.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps, rs);
        }
        return clientes;
    }
}